DepositData.tsx 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  1. "use client";
  2. import { DepositsTypes } from "@/api/depositsApi";
  3. import { getUserRechargeApi } from "@/api/user";
  4. import Box from "@/components/Box";
  5. import ButtonOwn from "@/components/ButtonOwn";
  6. import { useUserInfoStore } from "@/stores/useUserInfoStore";
  7. import { neReg } from "@/utils";
  8. import { Form, Input, Toast } from "antd-mobile";
  9. import { FormInstance } from "antd-mobile/es/components/form";
  10. import { useTranslations } from "next-intl";
  11. import { FC, Fragment, useRef, useState } from "react";
  12. import actions from "@/app/[locale]/(TabBar)/deposit/actions";
  13. import "@/styles/deposit.scss";
  14. interface Props {
  15. deposits: DepositsTypes[];
  16. }
  17. const DepositData: FC<Props> = (props) => {
  18. const { deposits } = props;
  19. const t = useTranslations();
  20. const userInfo = useUserInfoStore((state) => state.userInfo);
  21. const [activeType, setActiveType] = useState<DepositsTypes>(deposits[0]);
  22. const formInstanceRef = useRef<FormInstance>(null);
  23. let [amount, setAmount] = useState<number | undefined>(undefined);
  24. const titleChangeHandler = (item: DepositsTypes, index: number) => {
  25. setAmount(undefined);
  26. setActiveType(item);
  27. formInstanceRef.current?.resetFields();
  28. };
  29. const isStrictMode = true;
  30. const onFinish = (values: any) => {
  31. const params = { ...values, channel_id: activeType.id, amount: +values.amount };
  32. getUserRechargeApi(params)
  33. .then(async (res) => {
  34. formInstanceRef.current?.resetFields();
  35. Toast.show({ icon: "success", content: t("code.200"), maskClickable: false });
  36. setAmount(undefined);
  37. if (res.data.pay_url) {
  38. window.open(res.data.pay_url);
  39. }
  40. await actions();
  41. })
  42. .catch((error) => {
  43. Toast.show({ content: t(`code${error.data.code}`), maskClickable: false });
  44. });
  45. };
  46. const onValuesChange = (changeValues: any) => {
  47. if (changeValues.amount) {
  48. setAmount(changeValues.amount);
  49. }
  50. };
  51. const amountChange = (value: number) => {
  52. formInstanceRef.current?.setFieldValue("amount", value);
  53. setAmount(value);
  54. };
  55. const amountValidator = (rules: any, value: any) => {
  56. if (!value) return Promise.reject(new Error(t("form.amount")));
  57. if (+value < activeType.min_amount)
  58. return Promise.reject(
  59. new Error(t("form.amountMinReg", { amount: activeType.min_amount }))
  60. );
  61. if (+value > activeType.max_amount)
  62. return Promise.reject(
  63. new Error(t("form.amountMaxReg", { amount: activeType.max_amount }))
  64. );
  65. return Promise.resolve();
  66. };
  67. return (
  68. <div className="deposit-box">
  69. <div className="img-box"></div>
  70. <div className={"flex flex-wrap"}>
  71. {deposits.map((item, index) => {
  72. return (
  73. <Fragment key={item.id}>
  74. <p
  75. className="btn-box truncate"
  76. style={{
  77. borderColor: activeType.id === item.id ? "#ff9323" : "#333",
  78. }}
  79. onClick={() => titleChangeHandler(item, index)}
  80. >
  81. {item.name}
  82. </p>
  83. </Fragment>
  84. );
  85. })}
  86. </div>
  87. <Box className={"custom-form"} style={{ padding: 0 }}>
  88. <Form
  89. style={{
  90. "--border-bottom": "none",
  91. "--border-top": "none",
  92. "--border-inner": "none",
  93. }}
  94. ref={formInstanceRef}
  95. footer={
  96. <>
  97. <ButtonOwn active>{t("DepositPage.DepositarAgora")}</ButtonOwn>
  98. </>
  99. }
  100. initialValues={userInfo}
  101. onFinish={onFinish}
  102. onValuesChange={onValuesChange}
  103. >
  104. {isStrictMode ? (
  105. <>
  106. <Form.Item
  107. name="user_name"
  108. label=""
  109. rules={[{ required: true, message: t("form.usernameReg") }]}
  110. >
  111. <Input placeholder={t("form.username")} />
  112. </Form.Item>
  113. <Form.Item
  114. name="passport"
  115. label=""
  116. rules={[
  117. { required: true, message: t("form.cardReg"), pattern: neReg },
  118. ]}
  119. >
  120. <Input placeholder={t("form.card")} maxLength={11} type={"text"} />
  121. </Form.Item>
  122. </>
  123. ) : null}
  124. <Form.Item
  125. name="amount"
  126. label=""
  127. rules={[{ required: true, type: "number", validator: amountValidator }]}
  128. >
  129. <Input
  130. placeholder={`${t("DepositPage.Montante")}(BRL): Mín. ${activeType.min_amount}`}
  131. type={"number"}
  132. maxLength={activeType.max_amount}
  133. />
  134. </Form.Item>
  135. <div className={"flex flex-col"}>
  136. <div className={"flex-1"}>
  137. <ul className="ul-box">
  138. {activeType.products.map((item, index) => (
  139. <li
  140. className={amount == item.amount ? "active" : ""}
  141. key={index}
  142. onClick={() => amountChange(item.amount)}
  143. >
  144. {!!item.badge && <span className="hot"></span>}
  145. <div className="amountContent">
  146. {/* <span className="iconfont icon-unit-brl"></span> */}
  147. <span className="iconfont">R$</span>
  148. <span> {item.amount}</span>
  149. </div>
  150. <div>
  151. {item.rewards &&
  152. item.rewards
  153. .sort((p, n) => p.coin_type - n.coin_type)
  154. .map((reward, index) => {
  155. return (
  156. <Fragment key={index}>
  157. {reward.ratio > 0 ? (
  158. <span className="amountTips">
  159. {t("DepositPage.Oferecer")}{" "}
  160. {reward.ratio}%
  161. </span>
  162. ) : null}
  163. {reward.reward > 0 ? (
  164. <span className="amountTips">
  165. + {reward.reward}
  166. </span>
  167. ) : null}
  168. </Fragment>
  169. );
  170. })}
  171. </div>
  172. </li>
  173. ))}
  174. </ul>
  175. </div>
  176. </div>
  177. </Form>
  178. <div className={"mt-[5px] text-[0.12rem] text-primary-color"}>
  179. {t("DepositPage.depositTips")}
  180. </div>
  181. </Box>
  182. </div>
  183. );
  184. };
  185. export default DepositData;